package com.it.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLIntegrityConstraintViolationException;

//全局异常处理//底层是通过代理controller实现//通过AOP把save方法和其他的一些方法拦截到
//拦截所有类上加了@RestController或@Controller注解的controller
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody//接下来要写一个方法，这个方法需要返回json数据
@Slf4j
public class GlobalExceptionHandler {//前端页面提示。。。。已存在
    //指定拦截那些controller

    //异常处理方法//一旦controller抛这种异常，就会在这统一被拦截到，并处理
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)//表示它处理这种异常
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){//把异常信息注进来
        log.error(ex.getMessage());

        //判断异常信息里是否有关键字，如果有，就能确认，然后给它进一步提示
        if(ex.getMessage().contains("Duplicate entry")){//处理重复的，数据库加了unique约束的数据
//ex.getMessage()代表Duplicate entry 'www' for key 'employee.idx_username'这句话
                 //     0       1      2   3   4          5
            String[] split = ex.getMessage().split(" ");//根据空格进行分隔，就拿到了一个数组对象
            String msg = split[2] + "已存在";
            return R.error(msg);
        }

        return R.error("未知错误");
    }

    //异常处理方法//一旦controller抛这种异常，就会在这统一被拦截到，并处理
    @ExceptionHandler(CustomException.class)//表示它处理这种异常
    public R<String> exceptionHandler(CustomException ex){//把异常信息注进来
        log.error(ex.getMessage());


        return R.error(ex.getMessage());//就会返回给客户端页面，页面就会显示提示信息
    }
}
